/*
 * CLASSE de implementação da INTERFACE ServicoDAO
 */
package br.com.jkar.dao;

import br.com.jkar.bean.Servico;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Kamila Berto <kah.berto@gmail.com>
 */
public class ServicoDAOImpl implements ServicoDAO {

    Connection conn;
    PreparedStatement pst = null;
    ResultSet rs = null;

    @Override
    public Servico salvar(Servico servico) throws Exception {
        System.out.println("Cadastrando dados no BD...");
        try {
            conn = FabricarConexao.abrirConexao();//recebe o retorno do método abrirConexao()
            String stmt = "INSERT INTO servico (nome, descricao, valor, status) VALUES (?, ?, ?, ?)";
            pst = conn.prepareStatement(stmt, Statement.RETURN_GENERATED_KEYS);
            pst.setString(1, servico.getNome());
            pst.setString(2, servico.getDescricao());
            pst.setString(3, servico.getValor());
            pst.setString(4, servico.getStatus());
            pst.executeUpdate();
            rs = pst.getGeneratedKeys();
            rs.next();
            servico.setId(rs.getInt(1));
            System.out.println("Dados cadastrados com sucesso!");
        } catch (Exception e) {
            System.out.println("Erro ao salvar os dados no BD: " + e.getMessage());
            throw new Exception(e.getMessage());
            /*"Jogar a conexão pra cima", no caso, pro Servlet, que pode tratar 
             como quiser, por exemplo, pode enviar uma mensagem mais específica 
             para o usuário, na interface gráfica*/
        } finally {
            /*Independente do que acontecer (dando erro ou não, com return ou 
             com throw, SEMPRE será executado o FINALLY*/
            FabricarConexao.fecharConexao(conn, pst, rs);
        }
        return servico;
    }

    @Override
    public Servico alterar(Servico servico) throws Exception {
        System.out.println("Alterando os dados no BD...");
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "UPDATE servico SET nome = ?, descricao = ?, valor = ?, status = ? WHERE id = ?";
            pst = conn.prepareStatement(stmt);
            pst.setString(1, servico.getNome());
            pst.setString(2, servico.getDescricao());
            pst.setString(3, servico.getValor());
            pst.setString(4, servico.getStatus());
            pst.setInt(5, servico.getId());
            pst.executeUpdate();
            System.out.println("Dados alterados com sucesso!");
        } catch (Exception e) {
            System.out.println("Erro ao alterar os dados no BD: " + e.getMessage());
            throw new Exception(e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst, rs);
        }
        return servico;
    }

    @Override
    public void excluir(Integer id) throws Exception {
        System.out.println("Desativando o serviço selecionado...");
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "UPDATE servico SET status = 'Inativo' WHERE id = ?";
            pst = conn.prepareStatement(stmt);
            pst.setInt(1, id);
            pst.executeUpdate();
            System.out.println("Serviço desativado com sucesso!");
        } catch (Exception e) {
            System.out.println("Erro ao desativar o serviço: " + e.getMessage());
            throw new Exception(e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst, rs);
        }
    }

    private Servico setarServico(ResultSet rs, Servico servico) {
        try {
            servico.setId(rs.getInt("id"));
            servico.setNome(rs.getString("nome"));
            servico.setDescricao(rs.getString("descricao"));
            servico.setValor(rs.getString("valor"));
            servico.setStatus(rs.getString("status"));
        } catch (SQLException ex) {
            Logger.getLogger(ServicoDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return servico;
    }

    @Override
    public List<Servico> listarAtivos() throws Exception {
        System.out.println("Listando os serviços ativos...\n");
        List<Servico> servicos = new ArrayList<>();
        Servico servico;
        try {
            conn = FabricarConexao.abrirConexao();
            pst = conn.prepareStatement("SELECT * FROM servico WHERE status='Ativo'");
            rs = pst.executeQuery();
            while (rs.next()) {
                servico = new Servico();
                servicos.add(setarServico(rs, servico));
            }
        } catch (Exception e) {
            System.out.println("Erro ao listar os serviços ativos: "
                    + e.getMessage());
            throw new Exception(e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return servicos;
    }

    @Override
    public List<Servico> pesquisarNome(String nome) throws Exception {
        System.out.println("Pesquisando os serviços que contenham " + nome + " no campo 'Nome'...\n");
        List<Servico> servicos = new ArrayList<>();
        Servico servico;
        try {
            conn = FabricarConexao.abrirConexao();
            pst = conn.prepareStatement("SELECT * FROM servico WHERE nome LIKE ? "
                    + "AND status='Ativo'");
            pst.setString(1, "%" + nome + "%");
            rs = pst.executeQuery();
            while (rs.next()) {
                servico = new Servico();
                servicos.add(setarServico(rs, servico));
            }
        } catch (Exception e) {
            System.out.println("Erro ao retornar o resultado da pesquisa: "
                    + e.getMessage());
            throw new Exception(e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return servicos;
    }

    @Override
    public Servico pesquisarId(Integer id) throws Exception {
        System.out.println("Pesquisando ID do item selecionado...");
        Servico servico = new Servico();
        try {
            conn = FabricarConexao.abrirConexao();
            pst = conn.prepareStatement("SELECT * FROM servico WHERE id = ?");
            pst.setInt(1, id);
            rs = pst.executeQuery();
            rs.next();
            setarServico(rs, servico);
        } catch (Exception e) {
            System.out.println("Erro ao procurar item por ID no BD: " + e.getMessage());
            throw new Exception(e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return servico;
    }

    @Override
    public List<Servico> listar() throws Exception {
        return null;
    }

    @Override
    public Servico procurar(Integer id) throws Exception {
        return null; 
    }

}
